Числа Фибоначчи –
это последовательность
чисел f(n), которая задаётся формулой:
·
f(0) = 1,
·
f(1) = 1,
·
f(n) = f(n – 1) + f(n – 2)
По заданному
числу n выведите n-ое число Фибоначчи.
Вход. Неотрицательное число n (n ≤ 45) – номер
числа Фибоначчи, которое следует вывести.
Выход. Выведите n-ое
число Фибоначчи.
Пример
входа |
Пример
выхода |
4 |
5 |
числа
Фибоначчи
Вычислим все
числа Фибоначчи и поместим их в массив fib, установив fib[i] = f(i). Затем выведем требуемое число
Фибоначчи.
Массив fib будет
заполнен следующим образом:
Будем вычислять
числа Фибоначчи и сохранять их в массиве fib: fib[i] = f(i).
#define MAX 46
int fib[MAX];
Заполняем массив fib в соответствии с рекуррентной формулой.
fib[0] = 1;
fib[1] = 1;
for (int i = 2; i < MAX; i++)
fib[i] = fib[i-1] + fib[i-2];
Читаем входное значение n. Выводим ответ.
scanf("%d",&n);
printf("%d\n",fib[n]);
Для хранения чисел Фибоначчи объявим массив fib: fib[i]
= f(i).
#define MAX 46
int fib[MAX];
Рекурсивная функция f вычисляет n-ое число Фибоначчи. Используем технику мемоизации.
int f(int
n)
{
if (n <=
1) return 1;
if (fib[n] !=
-1) return fib[n];
return fib[n]
= f(n-1) + f(n - 2);
}
Основная часть программы. Читаем число n.
scanf("%d",&n);
Присвоим всем элементам массива fib значение -1.
memset(fib,-1,sizeof(fib));
Вычисляем и выводим значение f(n).
printf("%d\n",f(n));
Java реализация
import java.util.*;
public class Main
{
public static int MAX =
46;
static int fib[] = new int[MAX];
public static void
main(String[] args)
{
Scanner con = new
Scanner(System.in);
int n = con.nextInt();
fib[0] =
1; fib[1] = 1;
for(int i = 2;
i < MAX; i++)
fib[i] = fib[i-1] +
fib[i-2];
System.out.println(fib[n]);
con.close();
}
}
Java реализация – константная
память
import java.util.*;
public class Main
{
public static void
main(String[] args)
{
Scanner con = new
Scanner(System.in);
int n = con.nextInt();
int a = 1,
b = 1, temp;
for(int i = 0;
i < n; i++)
{
temp = a;
a = b;
b = temp + b;
}
System.out.println(a);
con.close();
}
}
Java реализация – рекурсия, TLE
import java.util.*;
public class Main
{
static int f(int n)
{
if (n <= 1) return 1;
return f(n-1) + f(n - 2);
}
public static void main(String[] args)
{
Scanner con = new
Scanner(System.in);
int n = con.nextInt();
System.out.println(f(n));
con.close();
}
}
Java реализация – рекурсия с
запоминанием
import java.util.*;
public class Main
{
static int fib[] = new int[46];
static int f(int n)
{
if (n <= 1) return 1;
if (fib[n] != -1) return fib[n];
return fib[n] = f(n-1) + f(n - 2);
}
public static void main(String[] args)
{
Scanner con = new
Scanner(System.in);
int n = con.nextInt();
Arrays.fill(fib, -1);
System.out.println(f(n));
con.close();
}
}
Python реализация – список
Для хранения чисел Фибоначчи объявим список fib: fib[i] = f(i).
fib = [1,1]
Заполняем список fib в соответствии с рекуррентной
формулой.
for i in
range(2,46):
fib.append(fib[i-1] + fib[i-2])
Основная часть программы. Читаем число n.
n = int(input())
Вычисляем и выводим значение f(n).
print(fib[n])
Python реализация – константная память
n = int(input())
a, b = 1, 1
for i in
range(n):
a, b = b, a + b
print(a)
Python реализация – запоминание
Для хранения чисел Фибоначчи объявим список fib: fib[i] = f(i).
fib = [-1] * 46
Рекурсивная функция f вычисляет n-ое число Фибоначчи. Используем технику мемоизации.
def f(n):
if n <= 1: return 1
if fib[n] != -1: return fib[n]
fib[n] = f(n - 1) + f(n - 2)
return fib[n]
Основная часть программы. Читаем число n.
n = int(input())
Вычисляем и выводим значение f(n).
print(f(n))